﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
    <script type="text/javascript">
        /*
        闭包：一个函数使用了其所在环境中的变量，那么就产生了闭包。要理解JavaScript的闭包，必须知道JavaScript函数的执行是分两个阶段的
        1.执行前的 “预编译”
        2.执行
        同时，当给一个函数多次定义时，只有最后一次的定义起作用。
        */
        
        /*
        function User(props) {
            for (var prop in props) {
                (function(currentObj) {  //这里的currentObj由this传过来的。this 为 User
                    alert(currentObj.constructor); //可以看出来currentObj 为User
                    //创建此属性的一个新的getter(读取器)
                    currentObj["get" + prop] = function() {
                        //alert(props.name+"  "+props.age+"  "+prop);
                        return props[prop];
                    }
                    //创建此属性的一个新的setter(设置器)
                    currentObj["set" + prop] = function(val) {
                        props[prop] = val;
                    };
                })(this);  //这里的this 为 User
            }
        }

        var user = new User({ "name": "chengkai", "age": 22 });

        //注意，name属性并不存在，因为它是属性对象（props Obj）的私有变量
        alert(user.name == null); //输出 true

        alert(user.getname());  //输出 22
        alert(user.getage());  //输出 22
        */
        
        
        
        

        //****************动态生成方法**********************
        //props 对象，如：{"name":"chengkai","age":22}
        //************************************************
        function User(props) {
            for (var prop in props) {
                (function(currentObj) {  //这里的currentObj由this传过来的。this 为 User
                    //创建此属性的一个新的getter(读取器)
                    (function(prop) {
                        currentObj["get" + prop] = function() {
                            //alert(props.name+"  "+props.age+"  "+prop);
                            return props[prop];
                        }
                        //创建此属性的一个新的setter(设置器)
                        currentObj["set" + prop] = function(val) {
                            props[prop] = val;
                        };
                    })(prop);
                })(this);  //这里的this 为 User
            }
        }

        var user = new User({ "name": "chengkai", "age": 22 });

        //注意，name属性并不存在，因为它是属性对象（props Obj）的私有变量
        alert(user.name == null); //输出 true

        alert(user.getname());  //输出 chengkai

        user.setage(11);
        user.setname("kai");
        alert(user.getage());  //输出 11
        alert(user.getname());  //输出 kai
    </script>
</head>
<body>

</body>
</html>
